﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Collections;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using DAL.Repositories;
using DAL;

namespace DAL.Repositories
{
    public class MaquinaRepository : IRepository<Maquina>
    {
        private List<IEntity> _insertItems;
        private List<IEntity> _updateItems;

        public MaquinaRepository()
        {
            _insertItems = new List<IEntity>();
            _updateItems = new List<IEntity>();
        }

        public void Insert(Maquina entity)
        {
            _insertItems.Add(entity);
        }

        public void Update(Maquina entity)
        {
            _updateItems.Add(entity);
        }

        public void Delete(Maquina entity)
        {
            throw new NotImplementedException();
        }

        public IEnumerable<Maquina> GetAll()
        {
            List<Maquina> listaMaquinas = null;

            SqlCommand cmd = new SqlCommand();
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_listar_maquinas");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaMaquinas = new List<Maquina>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    listaMaquinas.Add(new Maquina
                    {
                        Id = Convert.ToInt32(dr["id"]),
                        Nombre = dr["nombre"].ToString(),
                        NumMaquina = dr["numero_maquina"].ToString(),
                        NumActivo = dr["numero_activo"].ToString(),
                        Estado = Convert.ToBoolean(dr["estado"])
                    });
                }
            }

            return listaMaquinas;
        }

        public Maquina GetById(int id)
        {
            Maquina objMaquina = null;
            var sqlQuery = "SELECT id, nombre, numero_maquina, numero_activo, estado FROM Maquinas WHERE id = @id";
            SqlCommand cmd = new SqlCommand(sqlQuery);
            cmd.Parameters.AddWithValue("@id", id);

            var ds = DBAccess.ExecuteQuery(cmd);

            if (ds.Tables[0].Rows.Count > 0)
            {
                var dr = ds.Tables[0].Rows[0];

                objMaquina = new Maquina
                {
                    Id = Convert.ToInt32(dr["id"]),
                    Nombre = dr["nombre"].ToString(),
                    NumMaquina = dr["numero_maquina"].ToString(),
                    NumActivo = dr["numero_activo"].ToString(),
                    Estado = Convert.ToBoolean(dr["estado"])
                };
            }
            return objMaquina;
        }

        public void Save()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    if (_insertItems.Count > 0)
                    {
                        foreach (Maquina objMaquina in _insertItems)
                        {
                            InsertMaquina(objMaquina);
                        }
                    }

                    if (_updateItems.Count > 0)
                    {
                        foreach (Maquina objMaquina in _updateItems)
                        {
                            UpdateMaquina(objMaquina);
                        }
                    }
                    scope.Complete();
                }
                catch (TransactionAbortedException ex)
                {

                }
                catch (ApplicationException ex)
                {

                }
                finally
                {
                    Clear();
                }

            }
        }

        public void Clear()
        {
            _insertItems.Clear();
            _updateItems.Clear();
        }

        private void InsertMaquina(Maquina objMaquina)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();

                cmd.Parameters.Add(new SqlParameter("@nombre", objMaquina.Nombre));
                cmd.Parameters.Add(new SqlParameter("@numero_maquina", objMaquina.NumMaquina));
                cmd.Parameters.Add(new SqlParameter("@numero_activo", objMaquina.NumActivo));
                cmd.Parameters.Add(new SqlParameter("@estado", objMaquina.Estado));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_registrar_maquina");

            }
            catch (Exception ex)
            {

            }
        }

        private void UpdateMaquina(Maquina objMaquina)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();

                cmd.Parameters.Add(new SqlParameter("@id", objMaquina.Id));
                cmd.Parameters.Add(new SqlParameter("@nombre", objMaquina.Nombre));
                cmd.Parameters.Add(new SqlParameter("@numeroMaq", objMaquina.NumMaquina));
                cmd.Parameters.Add(new SqlParameter("@numeroActivo", objMaquina.NumActivo));
                cmd.Parameters.Add(new SqlParameter("@estado", objMaquina.Estado));

                DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_modificar_maquina");

            }
            catch (Exception ex)
            {

            }
        }
    }
}